/*
 * CHS.c
 *
 *  Created on: 06/10/2011
 *      Author: utn_so
 */

#include "CHS.h"

t_direccion_fisica obtener_dir_fis(uint32_t dir_logica){
	t_direccion_fisica direccion;

	direccion.cilindro = dir_logica / (configuracion.sector * configuracion.cabeza);

	direccion.cabeza = (dir_logica % (configuracion.sector * configuracion.cabeza)) / (configuracion.sector);

	direccion.sector = ((dir_logica % (configuracion.sector * configuracion.cabeza)) % (configuracion.sector));

	return direccion;
}

uint32_t obtener_dir_log(t_direccion_fisica dir_fisica){

	return (dir_fisica.sector + dir_fisica.cabeza * configuracion.sector
			+ dir_fisica.cilindro * configuracion.cabeza * configuracion.sector);

}

float tiempo_pista(t_direccion_fisica inicio, t_direccion_fisica fin) {

	float ST, RT, TTotal, tiempoPosSector;

	tiempoPosSector = ((float)60000 / (float)configuracion.rpm) / (float)configuracion.sector;

	ST = abs((float)inicio.cilindro - (float)fin.cilindro) * (float)configuracion.salto_pistas;
	if ((float)inicio.sector > (float)fin.sector) {
		RT = ((float)configuracion.sector - (float)inicio.sector
				+ (float)fin.sector)* tiempoPosSector;
	} else {
		RT = abs((float)inicio.sector - (float)fin.sector) * tiempoPosSector;
	}
	TTotal = ST + RT + (float)1 /*Tiempo Transferencia*/;
	return (TTotal);
}

t_direccion_fisica sumarSectores(t_direccion_fisica sector, uint32_t cantidad){
	t_direccion_fisica sectorSumado;
	sectorSumado = sector;
	if (sectorSumado.sector + cantidad >= configuracion.sector){
		sectorSumado.sector = configuracion.sector - (sectorSumado.sector + cantidad);
	}
	else {
		sectorSumado.sector += cantidad;
	}

return sectorSumado;
}

t_direccion_fisica restarSectores(t_direccion_fisica sector, uint32_t cantidad){
	t_direccion_fisica sectorRestado;
	sectorRestado = sector;
	if (sector.sector < cantidad){
		sectorRestado.sector = configuracion.sector - (cantidad - sector.sector);
	}
	else {
		sectorRestado.sector -= cantidad;
	}

return sectorRestado;
}
